#ifndef CALLER_H
#define CALLER_H

typedef union
{
	int Int;
	long long Long;
	char Byte;
	float Float;
	double Double;
	void *Pointer; 
} Variant;

typedef enum
{
	Int,
	Long,
	Float,
	Double,
	Char,
	Bool,
	Pointer,
	Struct,
	Array,
	String,
	Bigint,
	Void
} TypeKind;

typedef enum
{
	C,
	Pascal,
	Register
} CallingConvention;

extern "C"
{
	void callAssemblerFunctionVoid(void *func, void *args, int argsSize, int callingConvention);
	int callAssemblerFunctionInt(void *func, void *args, int argsSize, int callingConvention);
	long long callAssemblerFunctionLong(void *func, void *args, int argsSize, int callingConvention);
	char callAssemblerFunctionByte(void *func, void *args, int argsSize, int callingConvention);
	float callAssemblerFunctionFloat(void *func, void *args, int argsSize, int callingConvention);
	double callAssemblerFunctionDouble(void *func, void *args, int argsSize, int callingConvention);
	void* callAssemblerFunctionPointer(void *func, void *args, int argsSize, int callingConvention);
}

#endif
